home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 42 / Mac Magazin and MacEasy Magazine CD - Issue 42.iso / Software / Entwickler / Lingo Sierra Engine Folder / Engine / 00002_Script_Sierra Game Engine < prev    next >
Text File  |  1998-01-06  |  10KB  |  203 lines

  1. --The Sierra-Style Game Engine
  2. --============================
  3. --by Rudi Muiznieks
  4. --rudis@mindless.com
  5. --http://www.cadvision.com/muiznier
  6.  
  7. --Hello once again, folks!
  8. --This is my latest release of the Sierra-Style engine written in Lingo.
  9. --January 6, 1998
  10.  
  11. --Please, have a look at the read me file included in this archive for information on using
  12. --this code.
  13.  
  14. --NEW FEATURES
  15. --============
  16. --Smooth-moving sprites (no more jagginess when moving - goes in straight path)
  17. --Unpassable boundaries (Sprites that you set up that stop the character sprite)
  18.  
  19. --HOW IT WORKS
  20. --============
  21. --Basically you click the mouse, it gets the position of the click and the sprite, and then
  22. --calculates the path that the sprite has to move.  I've also gotten code in there that allows
  23. --for boundaries that the sprite stops at even if the mouse click was beyond the boundary.
  24. --The calculations are made by using the positions to get the horizontal and vertical distances
  25. --from the sprite to the mouse-click destination.  These are then used to divide each other
  26. --and come up with ratios that the sprite moves along the x and y axises (or whatever the plural
  27. --for axis is) until it hits either the destination or a boundary.  Then it stops.
  28.  
  29. --PROBLEMS/FUTURE UPDATES
  30. --=======================
  31. --There is one feature I plan to add and one bug I plan to fix.  The feature is when the sprite
  32. --hits a boundary it will slide along the boundary until it's x or y coordinate is the same as
  33. --the mouse or it hits a corner which is as far as it can go towards the mouse.  I have already
  34. --made a bit of progress with this (not in this release, but my next one).  The bug is minor -
  35. --the fact that as the sprite speeds up it can't get as close to the boundary as when it is slow.
  36. --This is not a major problem, but it can get annoying.  I may have to rethink the boundary
  37. --check to accomplish this.
  38.  
  39. global mhorz       --The horizontal position of the mouse
  40. global mvert       --Vertical pos of mouse
  41. global hdist       --Horizontal distance for sprite to move
  42. global vdist       --Vertical dist for sprite to move
  43. global svert       --Vertical pos of sprite
  44. global shorz       --Horiz pos of sprite
  45. global hratio      --Horiz ratio of mouse pos to sprite pos
  46. global vratio      --Vert ratio
  47. global hdir        --Horiz direction for sprite to move
  48. global vdir        --Vert dir
  49. global movetype    --Used in previous release
  50. global ismoving    --Whether the sprite is moving or not
  51. global t1var       --Used in previous release
  52. global t3var       --Used in previous release
  53. global speed       --Speed of movement
  54. global bratio      --Border slant ratio
  55. global sratio      --Sprite ratio compared to borders
  56. global cando       --Whether the mouse can continue moving (or hit a boudary)
  57. global btype       --What type of boundary (which slant direction, and is it taller or longer)
  58. global bsprite     --The sprite nums that are borders
  59.  
  60. on startmovie
  61.   set speed to 10                     --The number of pixels the sprite makes per jump
  62.   set the puppet of sprite 1 to true  --Moveable by lingo
  63.   set ismoving to false               --Starts off not moving
  64. end
  65.  
  66. on idle
  67.   if ismoving = true then calcpath  --If its moving then calculate the path of movement
  68. end idle
  69.  
  70. on mousedown
  71.   put the mousev into mvert            --Get the vertical pos of the mouseclick
  72.   put the mouseh into mhorz            --Get the horiz pos
  73.   put the locv of sprite 1 into svert  --Get the vertical location of the sprite
  74.   put the loch of sprite 1 into shorz  --Get the horiz pos
  75.   calcpath                             --Calculate the path of movement
  76.   updatestage                          --Update the stage with new sprite locations
  77. end
  78.  
  79. on calcpath
  80.   put abs(mvert - svert) into vdist               --The vertical distance from click to sprite
  81.   put abs(mhorz - shorz) into hdist               --The horiz distance
  82.   if float(hdist) <> 0 then
  83.     put float(vdist) / float(hdist) into vratio   --The vertical dist ratio
  84.   else
  85.     put 0 into vratio
  86.   end if
  87.   if float(vdist) <>0 then
  88.     put float(hdist) / float(vdist) into hratio   --The horiz dist ratio
  89.   else
  90.     set hratio to 0
  91.   end if
  92.   if hratio > vratio then
  93.     set hratio to 1
  94.     set vratio to vratio / hratio                 --*
  95.   else
  96.     set vratio to 1
  97.     set hratio to hratio / vratio                 --*
  98.   end if
  99.   --*We want one ratio to be equal to 1 and the other to be equal to less than one so that the
  100.   --sprite moves at equal speeds no matter where you click.
  101.   if mvert <= svert and mhorz >= shorz then
  102.     set hdir to speed
  103.     set vdir to -speed
  104.   end if
  105.   if mvert >= svert and mhorz <= shorz then
  106.     set hdir to -speed
  107.     set vdir to speed
  108.   end if
  109.   if mvert >= svert and mhorz >= shorz then
  110.     set hdir to speed
  111.     set vdir to speed
  112.   end if
  113.   if mvert <= svert and mhorz <= shorz then
  114.     set hdir to -speed
  115.     set vdir to -speed
  116.   end if
  117.   --I just set if the sprite is moving up or down and left or right on the screen
  118.   set ismoving to true                             --So it calls calcpath again
  119.   set the castNum of sprite 1 to 1                 --Animated while moving
  120.   moveit                                           --Changes the position of the sprite
  121. end
  122.  
  123. on moveit
  124.   set shorz to shorz + (hratio * hdir)  --Moving it horizontally
  125.   set svert to svert + (vratio * vdir)  --Moving it vertically
  126.   set ismoving to true                  --So it calls calcpath again
  127.   set the loch of sprite 1 to shorz     --Changing the actual horiz pos
  128.   set the locv of sprite 1 to svert     --Changing the actual vert pos
  129.   checkb                                --Checks for boundaries
  130.   updatestage                           --Updates with new sprite locations
  131.   set cando to true                     --Next move is boundary free by default
  132.   checkdone                             --Checks if it has reached its destination
  133. end
  134.  
  135. on checkdone
  136.   if (shorz < mhorz + speed and shorz > mhorz - speed) and (svert < mvert + speed ¨
  137.     and svert > mvert - speed) then
  138.     --If the sprite location is equal to the mouse location give or take the speed
  139.     set shorz to mhorz  --Sets the sprite to the click location exactly
  140.     set svert to mvert  --Ditto
  141.     stopmoving          --Sets everything back to standstill
  142.   end if
  143. end
  144.  
  145. on stopmoving
  146.   set the loch of sprite 1 to shorz - (hratio * hdir) --In case it overshot a boundary
  147.   set the locv of sprite 1 to svert - (vratio * vdir) --Ditto
  148.   set ismoving to false                               --So it doesnt call calcpath anymore
  149.   set the castNum of sprite 1 to 3                    --Back to non-animated
  150.   updatestage                                         --New sprite location
  151. end
  152.  
  153. --This is the part that checks boundaries.  The way it works is the boundaries are sprites of
  154. --horizontal lines, one from upper right to lower left, the other from upper left to lower
  155. --right. The ratios don't work correctly both when the sprite is stretched taller than wider
  156. --and vice versa, so there has to be two sets of code for each sprite.
  157.  
  158. on checkb
  159.   repeat with bsprite = 7 to 10  --The sprites that are boundaries
  160.     if the castnum of sprite bsprite = 26 then
  161.       if the width of sprite bsprite > the height of sprite bsprite then
  162.         --This boundary is wider than taller (width>height) and slants right-left (castnum 26)
  163.         put float(the width of sprite bsprite) / float(the height of sprite bsprite) into bratio
  164.         if (shorz - the right of sprite bsprite) / bratio > svert - the bottom of sprite bsprite - speed and (shorz - the right of sprite bsprite) / bratio < svert - the bottom of sprite bsprite + speed and shorz > the left of sprite bsprite and shorz < the right of sprite bsprite then
  165.           --Just checked if the sprite hit the boundary
  166.           stopmoving --Stops the sprite
  167.         end if
  168.       else
  169.         --This boundary is taller than wide not (width>height) and slants right-left (castnum 26)
  170.         put float(the height of sprite bsprite) / float(the width of sprite bsprite) into bratio
  171.         if (svert - the bottom of sprite bsprite) / bratio > shorz - the right of sprite bsprite - speed and (svert - the bottom of sprite bsprite) / bratio < shorz - the right of sprite bsprite + speed and svert > the top of sprite bsprite and svert < the bottom of sprite bsprite then
  172.           --Just checked if the sprite hit the boundary
  173.           stopmoving --Stops the sprite
  174.         end if
  175.       end if
  176.     else
  177.       if the width of sprite bsprite > the height of sprite bsprite then
  178.         --This boundary is wider than taller (width>height) and slants left-right not(castnum 26)
  179.         put float(the width of sprite bsprite) / float(the height of sprite bsprite) into bratio
  180.         if -(shorz - the right of sprite bsprite) / bratio > svert - the top of sprite bsprite - speed and -(shorz - the right of sprite bsprite) / bratio < svert - the top of sprite bsprite + speed and shorz > the left of sprite bsprite and shorz < the right of sprite bsprite then
  181.           --Just checked if the sprite hit the boundary
  182.           stopmoving --Stops the sprite
  183.         end if
  184.       else
  185.         --This boundary is taller than wide not(width>height) and slants
  186.         --left-right not(castnum 26)
  187.         put float(the height of sprite bsprite) / float(the width of sprite bsprite) into bratio
  188.         if -(svert - the top of sprite bsprite) / bratio > shorz - the right of sprite bsprite - speed and -(svert - the top of sprite bsprite) / bratio < shorz - the right of sprite bsprite + speed and svert > the top of sprite bsprite and svert < the bottom of sprite bsprite then
  189.           --Just checked if the sprite hit the boundary
  190.           stopmoving --Stops the sprite
  191.         end if
  192.       end if
  193.     end if
  194.   end repeat
  195. end
  196.  
  197. --That's it.  If you have any ideas on how to improve the code, any bug reports etc., please
  198. --send them to me at rudis@mindless.com.  If you have not yet done so, please read the read me
  199. --file that was included with this script for information on distributing this package or
  200. --using this code in one of your programs.
  201.  
  202. --Thanks a lot!
  203. --Rudi Muiznieks (previously DaFedz)